package com.hong.tomcat;

import javax.servlet.Servlet;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by John on 2019/1/31.
 * web.xml对应的java对象
 */
public class WebXml {
    /**
     * 项目文件夹地址
     */
    public String projectPath;

    /**
     * Servlet集合
     */
    public Map<String, String> servlets = new HashMap<>();

    /**
     * Servlet映射
     */
    public Map<String, String> servletMapping = new HashMap<>();

    /**
     * Servet实例集合
     */
    public Map<String, Servlet> servletInstances = new HashMap<>();

    public WebXml(String projectPath) {
        this.projectPath = projectPath;
    }

    public void loadServlet() throws Exception {
        /**
         * 执行，创建一个类的实例
         * 这里不能使用Class.forName(clazz).newInstance()因为这里是项目war包解析的
         */
        URLClassLoader loader = new URLClassLoader(new URL[]{
                new URL("file:" + projectPath + "\\WEB-INF\\classes\\")
        });

        // 遍历web.xml中的servlet-class定义
        for (Map.Entry<String, String> entry : servlets.entrySet()) {
            String servletName = entry.getKey();
            String servletClass = entry.getValue();

            /**
             * java.lang.ClassNotFoundException: com.hong.servlet.IndexServlet
             *   Class<?> cls = Class.forName(servletClass);
             */

            // 加载class到jvm中
            Class<?> clazz = loader.loadClass(servletClass);

            /**
             * Servlet 3.0后可以扫描@WebServlet
             */
           /* if (clazz.isAnnotationPresent(WebServlet.class)){
                WebServlet webServlet = clazz.getAnnotation(WebServlet.class);
                String actionName = webServlet.name();
                String[] reqUrl = webServlet.urlPatterns();

            }*/

            // 创建对象
            Servlet servlet = (Servlet) clazz.newInstance();
            // 因为Servlet默认是单例模式的
            servletInstances.put(servletName, servlet);
        }

        loader.close();
    }
}
